﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//class A
//{
//	
//public :
//	// 构造函数explicit就不再⽀持隐式类型转换
//	// explicit A(int a1)
//	 A(int a1)
//			: _a1(a1)
//	{}
//	//explicit A(int a1, int a2)
//	A(int a1, int a2)
//		:_a1(a1)
//		, _a2(a2)
//	{}
//	void Print()
//	{
//		cout << _a1 << " " << _a2 << endl;
//	}
//	int Get() const
//	{
//		return _a1 + _a2;
//	}
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//class B
//{
//	
//public :
//	B(const A& a)
//		: _b(a.Get())
//	{}
//private:
//	int _b = 0;
//};
//int main()
//{
//	// 1构造⼀个A的临时对象，再⽤这个临时对象拷⻉构造aa3
//	// 编译器遇到连续构造+拷⻉构造->优化为直接构造
//	A aa1 = 1;
//	aa1.Print();
//	
//	A aa3 = { 1,1 };//调用这个多参数的构造我们需要用花括号括起来才能进行初始化构造
//	
//	B b = aa3;//用A类型的对B类型的数据进行赋值操作的话，我们需要存在这个构造函数
//	return 0;
//}

// 实现⼀个类，计算程序中创建出了多少个类对象？

//A类创建了多少个对象
class A
{
	
public :
	A()
	{
		++_scount;
	} 
	A
	(const A& t)
	{
		++_scount;
	} 
	
	~A()
	{
		--_scount;
	} 
	static int GetACount()
	{
		return _scount;
	}
private:
	// 类⾥⾯声明
	static int _scount;
};
// 类外⾯初始化
int A::_scount = 0;//我们这里是要进行类域的声明的操作的
int main()
{

	cout << A::GetACount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetACount() << endl;
	cout << a1.GetACount() << endl;
	// 编译报错：error C2248: “A::_scount”: ⽆法访问 private 成员(在“A”类中声明)
	//cout << A::_scount << endl;
	return 0;
}
//如果我们不通过成员函数的话我们是访问不到的，因为这个静态成员变量是一个私有的
//我们是不可以直接通过类域进行这个静态成员变量的打印操作的
//所以我们是需要通过成员函数将这个静态成员变量进行返回的操作的